package cn.neusoft.annoaop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 切面类
 * 关注点代码  例如：事务处理
 */
@Component   //创建对象
@Aspect    //声明为一个切面类
public class Aop {

    //切入点表达式  给哪些类的哪些方法植入以下通知
    //execution（访问修饰符   任意返回值类型  包.类.方法(参数列表（任意参数类型）) ）
    @Pointcut("execution(public * cn.neusoft.annoaop.*Service.*(..))")   //*Service 表示xxxxService类都可调用该方法
    public void pointCut(){

    }

//    @Before("pointCut()")  //指定切入点
//    //在业务代码之前执行  前置通知
//    public void before(){
//        System.out.println("前置通知");
//    }
//
//    @After("pointCut()")  //指定切入点
//    //在业务代码之后执行   后置通知
//    public void after(){
//        System.out.println("后置通知");
//    }
//
//    @AfterThrowing("pointCut()")
//    public void afterThrowing(){
//        System.out.println("异常后通知");
//    }
//
//    @AfterReturning("pointCut()")
//    public void afterReturning(){
//        System.out.println("返回后通知");
//    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp){
        System.out.println("**"+pjp);
        System.out.println("开启事务");
        try{
            Object result = pjp.proceed();
            System.out.println("提交事务");
            return result;
        }catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("回滚事务");
            return null;
        } finally {
            System.out.println("关闭事务");
        }
    }

}
